package com.cisetech.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * Date 工具类 
 * @author Dyc
 */
public class DateUtils {
	
	private static SimpleDateFormat sdf;
	private static SimpleDateFormat getSdf(int type) {
		if(type == 1){
			return sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		}else if(type == 2 || type == 0){
			return sdf = new SimpleDateFormat("yyyy-MM-dd");
		}else if(type == 3){
			return sdf = new SimpleDateFormat("yyyy-M-d HH:mm:ss");
		}else if(type == 4){
			return sdf = new SimpleDateFormat("yyyyMMdd");
		}else if(type == 5){
			return sdf = new SimpleDateFormat("yyyy-M-d");
		}else{
			return sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		}
	}
	
	/**
	 * 获得服务器当前日期及时间，以格式为：yyyy-MM-dd HH:mm:ss的日期字符串形式返回
	 */
	public static String getDateTime() {
		try {
			Calendar cale = Calendar.getInstance();
			return getSdf(1).format(cale.getTime());
		} catch (Exception e) {
			return "";
		}
	}
	
	/**
	 * 根据时间 String 返回  Date
	 * @param type  1 为  yyyy-MM-dd HH:mm:ss格式  2为  yyyy-MM-dd格式  3为 yyyy-M-d HH:mm:ss  4为yyyyMMdd 5为 yyyy-M-d
	 * @return
	 */
	public static Date str2Date(String dateStr,int type){
		Date date = null;
		try {
			sdf = getSdf(type);
			date = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 根据时间 Date 返回  String
	 * @param type  type  1 为  yyyy-MM-dd HH:mm:ss格式  2为  yyyy-MM-dd格式  3为 yyyy-M-d HH:mm:ss 4为yyyyMMdd 5为 yyyy-M-d
	 * @return
	 */
	public static String date2Str(Date date,int type){
		sdf = getSdf(type);
		return sdf.format(date);
	}
	
	
	//----------------- 首页  足迹  时间显示格式
	/**
	 * 首页 足迹   显示的时间  
	 * @param date
	 * @return  String[]  0 ：月：1 1：日：1   2：时间：24：00  
	 */
	public static String[] formatDataByLogin(Date date){
		String[] reStr = new String[4]; 
		String dateStr = date2Str(date,3);
		String[] str1 = dateStr.split(" ");
		String fistStr = str1[0];
		String lastStr = str1[1];
		//年
		reStr[0] = (fistStr.split("-"))[0];
		//月
		reStr[1] = (fistStr.split("-"))[1];
		//日
		reStr[2] = (fistStr.split("-"))[2];
		//天
		reStr[3] = lastStr.substring(0,lastStr.lastIndexOf(":"));
		
		return reStr;
	}
	
	/**
	 * 获得年
	 * @return
	 */
	public static String getYearByLogin(Date date){
		String[] str = formatDataByLogin(date);
		return str[0];
	}
	
	/**
	 * 获得月
	 * @return
	 */
	public static String getMonthByLogin(Date date){
		String[] str = formatDataByLogin(date);
		int i = Integer.parseInt(str[1]);
		return marchConversionCapital(i)+"";
	}
	
	/**
	 * 获得日
	 * @return
	 */
	public static String getDayByLogin(Date date){
		String[] str = formatDataByLogin(date);
		return str[2];
	}
	
	/**
	 * 获得时间
	 * @return
	 */
	public static String getTimeByLogin(Date date){
		String[] str = formatDataByLogin(date);
		return str[3];
	}
	
	
	/**
	 * 月份格式化后显示大写月份（一,三，九）
	 * @param march
	 * @return
	 */
	public static String marchConversionCapital(int march){
		String marchCapital=new String();
		switch(march) { 
			case 1: 
				marchCapital="一";
				break; 
			case 2: 
				marchCapital="二";
				break; 
			case 3: 
				marchCapital="三";
				break; 
			case 4: 
				marchCapital="四";
				break; 
			case 5: 
				marchCapital="五";
				break; 
			case 6: 
				marchCapital="六";
				break; 
			case 7: 
				marchCapital="七";
				break; 
			case 8: 
				marchCapital="八";
				break; 
			case 9: 
				marchCapital="九";
				break; 
			case 10: 
				marchCapital="十";
				break; 
			case 11: 
				marchCapital="十一";
				break; 
			case 12: 
				marchCapital="十二";
				break; 
			default: 
				marchCapital="一";
				break; 
			} 
			return marchCapital;
		}
	/**
	 * 计算日期相减
	 * @param oldDate 以前的日期，格式为yyyy-MM-dd
	 * @param newDate 现在的日期，格式为yyyy-MM-dd
	 * @return
	 */
	public static String dateSubtraction(String oldDate,String newDate){
		String[] a=newDate.split("-");
	    String[] b=oldDate.split("-");
	    int ya = Integer.valueOf(a[0]);
	    int ma = Integer.valueOf(a[1]);
	    int da = Integer.valueOf(a[2]);
	    int yb = Integer.valueOf(b[0]);
	    int mb = Integer.valueOf(b[1]);
	    int db = Integer.valueOf(b[2]);
	    int d,m,y;
	    if(da-db>=0){
	    	d=da-db;
	    	if(ma-mb>=0){
	    		m=ma-mb;
	    		y=ya-yb;
	    	}else {
				ya=ya-1;
				m=ma-mb+12;
				y=ya-yb;
			}
	    }else {
			ma=ma-1;
			d=da-db+30;
			if(ma-mb>=0){
	    		m=ma-mb;
	    		y=ya-yb;
	    	}else {
				ya=ya-1;
				m=ma-mb+12;
				y=ya-yb;
			}
		}
	    String s=y+"岁"+m+"个月"+d+"天";
	    return s;
	}

	/**
	 * 根据   2010-02-05获得宝贝多大了   	根据身份日期判断
	 * @param birthday
	 * @return
	 */
	public static int getAge(String birthday) {
		String[] bStr = birthday.split("-");
		String curDate = date2Str(new Date(),2);
		String[] cStr = curDate.split("-");
		int ageY = Integer.parseInt(cStr[0]) - Integer.parseInt(bStr[0]);
		if((Integer.parseInt(bStr[1])-Integer.parseInt(cStr[1])) < 0){
			ageY-=1;
		}else if(Integer.parseInt(bStr[1]) == Integer.parseInt(cStr[1]) && (Integer.parseInt(bStr[2])-Integer.parseInt(cStr[2])) < 0 ){
			ageY-=1;
		}
		return ageY;
	}
	
	/**
	 * 通过当前日期，获得该月的所有天数时间
	 * @param date
	 * @return
	 */
	public static List<Date> getAllTheDateOftheMonth(Date date) {
		List<Date> list = new ArrayList<Date>();
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DATE, 1);

		int month = cal.get(Calendar.MONTH);
		while (cal.get(Calendar.MONTH) == month) {
			list.add(cal.getTime());
			cal.add(Calendar.DATE, 1);
		}
		return list;
	}
	/**
	 * yyyy-MM-dd日期格式 加减日期
	 * @param time 要被减的时间
	 * @param m 被加减的天数
	 * @param type  type  1 为  yyyy-MM-dd HH:mm:ss格式  2为  yyyy-MM-dd格式  3为 yyyy-M-d HH:mm:ss 4为yyyyMMdd 5为 yyyy-M-d
	 */
	public static String dayCount(Date date,int m,int type) {
			sdf = getSdf(type);
			Calendar cal=Calendar.getInstance();
			cal.setTime(date);
			cal.add(Calendar.DATE, m);  //减1天
			return sdf.format(cal.getTime());
	}
	/**
	 * yyyy-MM-dd日期格式 加减日期
	 * @param time 要被减的时间
	 * @param m 被加减的天数
	 * @param type  type  1 为  yyyy-MM-dd HH:mm:ss格式  2为  yyyy-MM-dd格式  3为 yyyy-M-d HH:mm:ss 4为yyyyMMdd 5为 yyyy-M-d
	 */
	public static Date dayCountOfYear(Date date,int m,int type) {
			sdf = getSdf(type);
			Calendar cal=Calendar.getInstance();
			cal.setTime(date);
			cal.add(Calendar.YEAR, m);  //减1天
			return cal.getTime();
	}
}